/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-22 13:44:56
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-22 18:16:32
 * @FilePath: /lesson18/mysignal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>

using namespace std;

#include <cassert>
#include<cstring>

#include <unistd.h>
#include <signal.h>

void PrintPending()
{
    sigset_t pd;
    int ret = sigpending(&pd);
    assert(ret == 0);
    (void)ret;

    for (int signo = 1; signo <= 31; ++signo)
    {
        if (sigismember(&pd, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void sighandler(int signo)
{
    cout << "捕捉到：" << signo << endl;
    int cnt = 5;
    while (cnt--)
    {
        PrintPending();
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));

    act.sa_handler = sighandler;
    sigaddset(&act.sa_mask, 3);
    sigaction(2, &act, &oact);
    while (true)
    {
        PrintPending();
        sleep(1);
    }

    return 0;
}

// int main()
// {
//     // 捕捉信号2
//     signal(2, sighandler);

//     // 1. 将信号2阻塞
//     sigset_t set, oset;
//     // 初始化
//     sigemptyset(&set);
//     sigemptyset(&oset);
//     sigaddset(&set, 2); // 设置2信号bit位为1
//     // 设置到进程中
//     sigprocmask(SIG_SETMASK, &set, &oset);
//     cout << "设置信号2的阻塞" << endl;
//     int cnt = 0;

//     while (true)
//     {
//         // 获取pending的信号集
//         PrintPending();
//         sleep(1);
//         if (cnt++ == 10)
//         {
//             sigprocmask(SIG_SETMASK, &oset, &set);
//             cout << "解除信号2的阻塞" << endl;
//         }
//     }

//     return 0;
// }